package com.itextpdf.text.pdf.parser;
import com.itextpdf.testutils.CompareTool;
import com.itextpdf.testutils.TestResourceUtils;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfChunk;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class HighlightItemsTest {
static final private String outputPath = "./target/com/itextpdf/text/pdf/parser/HighlightItemsTest/";
static final private String inputPath = "./src/test/resources/com/itextpdf/text/pdf/parser/HighlightItemsTest/";
@Before
public void before() {
new File(outputPath).mkdirs();
}
@Test
public void highlightPage229() throws IOException, DocumentException, InterruptedException, URISyntaxException {
String input = inputPath + "page229.pdf";
String output = outputPath + "page229.pdf";
String cmp = inputPath + "cmp_page229.pdf";
parseAndHighlight(input, output, false);
Assert.assertEquals(null, new CompareTool().compareByContent(output, cmp, outputPath, "diff"));
}
@Test
public void highlightCharactersPage229() throws IOException, DocumentException, InterruptedException, URISyntaxException {
String input = inputPath + "page229.pdf";
String output = outputPath + "page229_characters.pdf";
String cmp = inputPath + "cmp_page229_characters.pdf";
parseAndHighlight(input, output, true);
Assert.assertEquals(null, new CompareTool().compareByContent(output, cmp, outputPath, "diff"));
}
@Test
public void highlightIsoTc171() throws IOException, DocumentException, InterruptedException, URISyntaxException {
String input = inputPath + "ISO-TC171-SC2_N0896_SC2WG5_Edinburgh_Agenda.pdf";
String output = outputPath + "SC2_N0896_SC2WG5_Edinburgh_Agenda.pdf";
String cmp = inputPath + "cmp_ISO-TC171-SC2_N0896_SC2WG5_Edinburgh_Agenda.pdf";
parseAndHighlight(input, output, false);
Assert.assertEquals(null, new CompareTool().compareByContent(output, cmp, outputPath, "diff"));
}
@Test
public void highlightCharactersIsoTc171() throws IOException, DocumentException, InterruptedException, URISyntaxException {
String input = inputPath + "ISO-TC171-SC2_N0896_SC2WG5_Edinburgh_Agenda.pdf";
String output = outputPath + "ISO-TC171-SC2_N0896_SC2WG5_Edinburgh_Agenda_characters.pdf";
String cmp = inputPath + "cmp_ISO-TC171-SC2_N0896_SC2WG5_Edinburgh_Agenda_characters.pdf";
parseAndHighlight(input, output, true);
Assert.assertEquals(null, new CompareTool().compareByContent(output, cmp, outputPath, "diff"));
}
@Test
public void highlightHeaderFooter() throws IOException, DocumentException, InterruptedException, URISyntaxException {
String input = inputPath + "HeaderFooter.pdf";
String output = outputPath + "HeaderFooter.pdf";
String cmp = inputPath + "cmp_HeaderFooter.pdf";
parseAndHighlight(input, output, false);
Assert.assertEquals(null, new CompareTool().compareByContent(output, cmp, outputPath, "diff"));
}
@Test
public void highlightCharactersHeaderFooter() throws IOException, DocumentException, InterruptedException, URISyntaxException {
String input = inputPath + "HeaderFooter.pdf";
String output = outputPath + "HeaderFooter_characters.pdf";
String cmp = inputPath + "cmp_HeaderFooter_characters.pdf";
parseAndHighlight(input, output, true);
Assert.assertEquals(null, new CompareTool().compareByContent(output, cmp, outputPath, "diff"));
}
void parseAndHighlight(String input, String output, boolean singleCharacters) throws IOException, DocumentException {
PdfReader reader = new PdfReader(input);
FileOutputStream fos = new FileOutputStream(output);
PdfStamper stamper = new PdfStamper(reader, fos);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
MyRenderListener myRenderListener = singleCharacters ? new MyCharacterRenderListener() : new MyRenderListener();
for (int pageNum = 1; pageNum <= reader.getNumberOfPages(); pageNum++) {
List<Rectangle> rectangles = parser.processContent(pageNum, myRenderListener).getRectangles();
PdfContentByte canvas = stamper.getOverContent(pageNum);
canvas.setLineWidth(0.5f);
canvas.setColorStroke(BaseColor.RED);
for (Rectangle rectangle : rectangles) {
canvas.rectangle(rectangle.getLeft(), rectangle.getBottom(), rectangle.getWidth(), rectangle.getHeight());
canvas.stroke();
}
}
stamper.close();
fos.close();
reader.close();
}
static private String getOutputPdfPath(Class<?> c, String inputPdf, String suffix) throws URISyntaxException {
File f = new File(c.getClassLoader().getResource(TestResourceUtils.getFullyQualifiedResourceName(c, inputPdf)).toURI());
return f.getAbsolutePath() + suffix;
}
static private String getOutputPdfPath(Class<?> c, String inputPdf) throws URISyntaxException {
File f = new File(c.getClassLoader().getResource(TestResourceUtils.getFullyQualifiedResourceName(c, inputPdf)).toURI());
return f.getAbsolutePath().replaceAll(inputPdf, "");
}
static class MyRenderListener implements RenderListener {
private List<Rectangle> rectangles = new ArrayList<Rectangle>();
public void beginTextBlock() {
}
public void renderText(TextRenderInfo renderInfo) {
Vector startPoint = renderInfo.getDescentLine().getStartPoint();
Vector endPoint = renderInfo.getAscentLine().getEndPoint();
float x1 = Math.min(startPoint.get(0), endPoint.get(0));
float x2 = Math.max(startPoint.get(0), endPoint.get(0));
float y1 = Math.min(startPoint.get(1), endPoint.get(1));
float y2 = Math.max(startPoint.get(1), endPoint.get(1));
rectangles.add(new Rectangle(x1, y1, x2, y2));
}
public void endTextBlock() {
}
public void renderImage(ImageRenderInfo renderInfo) {
}
public List<Rectangle> getRectangles() {
return rectangles;
}
}
static class MyCharacterRenderListener extends MyRenderListener {
@Override
public void renderText(TextRenderInfo renderInfo) {
for (TextRenderInfo tri : renderInfo.getCharacterRenderInfos())
super.renderText(tri);
}
}
}